第 2 步 - 访问 Kanzi Studio 工程中创建的内容

在本教程中,您将创建小组件存储,为您提供一个视图,供您浏览和选择小组件,并选择要在另一个视图中查看其说明的小组件。您在上一步骤末尾运行工程时,仅看到应用程序背景。在本教程上一步中通过 Kanzi Studio 工程创建、并使用 API 加载的 kzb 文件包括使用该 API 创建应用程序逻辑所需的所有节点和资源:

要使用 Kanzi Engine API 访问 Kanzi Studio 工程的内容:

  1. 要创建预设件实例,并将其添加到 Widget Grid List Box 节点中,您需要从工程加载这些资产进行访问。为了稍后访问在应用程序代码中加载的工程资产,在应用程序类的成员变量中创建并存储资产。
    private: 
    
        //3D 网格列表框 (Grid List Box 3D) 节点,其中包含小组件。
        GridListBox3DSharedPtr m_widgetList;
    
        //当前在 Widget Grid List Box 节点中选择的小组件。
        GridListBox3D::ItemSharedPtr m_selectedItem;
    
        //场景摄像机。
        CameraSharedPtr m_camera;
    
        //摄像机动画变换目标。
        SRTValue3D m_cameraTransformationTarget;
    
        //动画化摄像机的动画剪辑。
        SRTValue3DAnimationSharedPtr m_cameraAnimation;
    
        //动画化摄像机的时间线回放。
        TimelinePlaybackSharedPtr m_cameraPlayback;
    
        //高亮显示该项的时间线回放。
        TimelinePlaybackSharedPtr m_widgetHighlightPlayback;
    
        //启用 Back button 的时间线回放。
        TimelinePlaybackSharedPtr m_backButtonEnablePlayback;
    
        //动画化选定小组件的动画剪辑项。
        SRTValue3DAnimationSharedPtr m_selectedItemAnimation;
    
        //含已选小组件和 Back button 
        //描述的描述面板。
        NodeSharedPtr m_widgetDescriptionNode;
    
        //动画化小组件描述可见性的动画剪辑。
        BoolAnimationSharedPtr m_widgetDescriptionVisibilityAnimation;
    
        //动画化小组件描述可见性动画的时间线回放。
        TimelinePlaybackSharedPtr m_widgetDescriptionVisibilityPlayback;
    
        //3D 文本块 (Text Block 3D) 节点,其中显示
        //Widget Description Layer 节点中的小组件描述。
        TextBlock3DSharedPtr m_widgetDescriptionTextBlock;
    
        //小组件上的 Back button。
        NodeSharedPtr m_backButton;
    
        //禁用和启用 Back button 的动画剪辑。
        BoolAnimationSharedPtr m_backButtonEnableAnimation;
    
        //用于存储小组件名称的用户定义属性类型。
        StringDynamicPropertyTypeSharedPtr m_widgetNamePropertyType;
    
        //用于存储小组件描述的用户定义属性类型。
        StringDynamicPropertyTypeSharedPtr m_widgetDescriptionPropertyType;
  2. ProgrammerTutorialApplication 类中的 onConfigure 函数后添加 onProjectLoaded() 函数。
    当您将函数置于 onProjectLoaded() 内,Kanzi 会在您加载应用程序后调用该函数。
    protected: 
    
        //在加载工程时初始化应用程序。
        virtual void onProjectLoaded() KZ_OVERRIDE
        {
        }
  3. 要访问 kzb 文件中的节点,首先要获取该 屏幕 (Screen) 节点,然后使用别名或相对路径获取每个节点。
    使用别名 (Alias) 实现对 Kanzi 节点的一致访问。您可以使用别名在 Kanzi StudioKanzi Engine API 或脚本中访问节点。 因为您在 Kanzi Studio 中创建应用程序时在工程的场景图中移动了节点,所以跟踪这些节点的最简单方法是使用别名。您可以通过绑定、API 或者使用井号 (#) 后跟别名名称来检索别名目标节点,而不管节点在工程中的位置。请参阅 使用别名
    例如,在本教程中,Widget Grid List Box 的别名为 Widget list,并且存储在 Widget Store Screen 节点的资源字典中。通过其在 API 中的别名使用 #Widget list 访问 Widget Grid List Box 节点。
    virtual void onProjectLoaded() KZ_OVERRIDE
    {
        ScreenSharedPtr screen = getScreen();
    
        //访问 Kanzi Studio 工程二进制文件的内容。
    
        //获取存储所有小组件实例的 3D 网格列表框 (Grid List Box 3D) 组件引用。
        //该路径由 Kanzi Studio 工程中可编辑的别名定义。
        GridListBox3DSharedPtr widgetList = screen->lookupNode<GridListBox3D>("#Widget list");
    
        //获取摄像机对象节点引用,将进行动画化。
        CameraSharedPtr camera = screen->lookupNode<Camera>("#Camera");
    
        //创建摄像机目标变换。
        SRTValue3D cameraTransformationTarget = SRTValue3D(Vector3(1.0f, 1.0f, 1.0f), Vector3(kzsDegreesToRadians(60.0f), kzsDegreesToRadians(0.0f), 0.0f), Vector3(-1.5f, 7.0f, -5.0f));
            
        //获取Widget Description Layer 节点的引用。
        NodeSharedPtr widgetDescriptionNode = screen->lookupNode<Node>("#Widget description layer");
    
        //获取对Widget Description Layer 中文本块的引用,其中显示小组件说明。
        TextBlock3DSharedPtr widgetDescriptionTextBlock = screen->lookupNode<TextBlock3D>("#Widget description");
            
        //获取Widget Description Layer 节点中的 Back button 引用。
        NodeSharedPtr backButton = screen->lookupNode<Node>("#Back button");
    
        //创建禁用和启用Back button 的动画剪辑。
        BoolAnimationSharedPtr backButtonEnableAnimation = FromToAnimation<bool, StepEasingFunction>::create(getDomain(), chrono::seconds(1), false, true);
    
        //创建隐藏Widget Description Layer 的动画剪辑。
        BoolAnimationSharedPtr widgetDescriptionVisibilityAnimation = FromToAnimation<bool, StepEasingFunction>::create(getDomain(), chrono::seconds(1), true, false);
    
        //为动画化选定列表框项而创建动画剪辑。
        SRTValue3DAnimationSharedPtr selectedItemAnimation = FromToAnimation<SRTValue3D, LinearEasingFunction>::create(getDomain(), chrono::milliseconds(800),
                SRTValue3D(Vector3(1.0f, 1.0f, 1.0f), Vector3(kzsDegreesToRadians(0.0f), 0.0f, 0.0f),  Vector3(0.0f, 0.0f, 0.0f)),
                SRTValue3D(Vector3(1.0f, 1.0f, 1.0f), Vector3(kzsDegreesToRadians(60.0f), 0.0f, 0.0f), Vector3(0.0f, 0.0f, 1.0f)));
    }
  4. 本教程中使用 Kanzi Studio 工程中定义的自定义属性类型。要访问这些自定义属性类型,创建 DynamicPropertyType 并使用 Kanzi Studio 工程中使用的相同名称。 属性和资源一样包含在共享指针中。
    class ProgrammerTutorialApplication: public ExampleApplication
    {
    ...
        //键入在 Kanzi Studio 工程中定义的自定义属性类型
        //的共享指针。
        typedef shared_ptr<DynamicPropertyType<string> > StringDynamicPropertyTypeSharedPtr;
    
    protected: 
    
        virtual void onProjectLoaded() KZ_OVERRIDE
        {
        ...
            //获取自定义属性类型,以存储小组件名称。自定义
            //属性类型在 Kanzi Studio 工程中创建。
            StringDynamicPropertyTypeSharedPtr widgetNamePropertyType =
                StringDynamicPropertyTypeSharedPtr(new DynamicPropertyType<string>("Programmertutorial.WidgetName"));
    
            //获取自定义属性类型,以存储小组件描述。自定义
            //属性类型在 Kanzi Studio 工程中创建。
            StringDynamicPropertyTypeSharedPtr widgetDescriptionPropertyType =
                StringDynamicPropertyTypeSharedPtr(new DynamicPropertyType<string>("Programmertutorial.WidgetDescription"));
        }
        ...
    };
  5. 在成员变量中存储获得的资源,以便稍后访问。
    virtual void onProjectLoaded() KZ_OVERRIDE
    {
    ...
        //存储获得的资源和查找的节点。
        using std::swap;
        swap(m_widgetList, widgetList);
        swap(m_camera, camera);
        swap(m_cameraTransformationTarget, cameraTransformationTarget);
        swap(m_selectedItemAnimation, selectedItemAnimation);
        swap(m_widgetDescriptionNode, widgetDescriptionNode);
        swap(m_widgetDescriptionVisibilityAnimation, widgetDescriptionVisibilityAnimation);
        swap(m_widgetDescriptionTextBlock, widgetDescriptionTextBlock);
        swap(m_backButton, backButton);
        swap(m_backButtonEnableAnimation, backButtonEnableAnimation);
        swap(m_widgetNamePropertyType, widgetNamePropertyType);
        swap(m_widgetDescriptionPropertyType, widgetDescriptionPropertyType);
    }

< 上一步
下一步 >

另请参阅

使用别名

创建属性类型

属性系统

资源管理